<?php namespace system\model;

use houdunwang\arr\Arr;
use houdunwang\model\Model;

/** 栏目分类管理模型
 * Class Category
 * @package system\model
 */
class Category extends Model
{
    //数据表
    protected $table = "category";

    //允许填充字段
    protected $allowFill = ['*'];

    //禁止填充字段
    protected $denyFill = [];

    //自动验证
    protected $validate = [
        //['字段名','验证方法','提示信息',验证条件,验证时间]
        ['cate_name', 'required', '栏目名称不能为空', self::MUST_VALIDATE, self::MODEL_BOTH],
        ['cate_description', 'required', '栏目描述不能为空', self::MUST_VALIDATE, self::MODEL_BOTH],
    ];

    //自动完成
    protected $auto = [
        //['字段名','处理方法','方法类型',验证条件,验证时机]
        ['cate_sort', 'intval', 'function', self::MUST_AUTO, self::MODEL_BOTH],
    ];

    //自动过滤
    protected $filter = [
        //[表单字段名,过滤条件,处理时间]
    ];

    //时间操作,需要表中存在created_at,updated_at字段
    protected $timestamps = true;

    /**
     *  getAllCate  获取栏目数据表的所有数据  并转为树形结构
     * @return mixed
     */
    public function getAllCate()
    {
        //return $this->get(); //获取模型    Arr:tree();  //树形形状
        //return $this->get()->toArray(); //toArray()，转为数组
        //1. 获取树形结构
        return Arr::tree($this->get()->toArray(), 'cate_name', $fieldPri = 'cate_id', $fieldPid = 'cate_pid');
    }

    /**
     * 获取除了自己和自己子集之外的数据
     * @param $cate_id
     */
    public function getSonCateData($cate_id)
    {
        /**
         * 调用getSon内部方法传入$data,$cate_id 获取所有数据
         */
        //1. 递归找子级
        $cids = $this->getSon($this->get()->toArray(), $cate_id);
        //2. 把自己cate_id追加进数据进行排除
        $cids[] = $cate_id;
        //p($cids);
        //3. 把自己与子集踢出去
        $res = $this->whereNotIn('cate_id', $cids)->get()->toArray();
        //p($res);
        return Arr::tree($res, 'cate_name', 'cate_pid');

    }

    /**
     *  递归找子级
     * @param $data                栏目所有数据
     * @param $cate_id            我们找$cate_id所有子集，栏目id
     */
    public function getSon($data, $cate_id)
    {
        //1. 使用静态变量，不然每次调用自己的时候，$temp都是从空开始
        static $temp = [];
        foreach ($data as $k => $v) {
            if ($v['cate_pid'] == $cate_id) {
                $temp[] = $v['cate_id'];
                $this->getSon($data, $v['cate_id']);
            }
        }
        return $temp;
    }

    /**
     * del 删除模型方法
     */
    public function del($cate_id)
    {
        //1.删除  找出当前cate_id这条数据进行删除
        $model = Category::find($cate_id);
        //p(Category::get()->toArray());
        //2.判断删除操作  如果有子集不允许删除
        //var_dump($this->where('cate_pid',$cate_id)->get());die;
        if ($this->where('cate_pid', $cate_id)->get()) {
            //3.将错误信息存入到模型中
            $this->setError(['请先删除子目录']);
            return false;
        }
        //4. 删除当前的数据对象
        return $model->destory();
    }
}
